import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics import roc_curve, auc, confusion_matrix, classification_report
import os
import joblib
import pandas as pd


def evaluate_model(model, X_test, y_test, fig_path, model_name, module_name=None):
    """
    评估模型的性能，并生成相关的可视化图表和报告。

    :param model: 训练好的模型对象。
    :param X_test: 测试集特征数据。
    :param y_test: 测试集标签数据。
    :param fig_path: 保存图表和报告的路径。
    :param model_name: 模型的名称，用于图表和报告的标题。
    :param module_name: 调用工具的脚本名称，用于图表命名。
    :return: ROC曲线下的面积（AUC）。
    """
    # 预测概率和标签
    y_pred = model.predict(X_test)
    y_prob = model.predict_proba(X_test)[:, 1]

    # ROC曲线
    fpr, tpr, _ = roc_curve(y_test, y_prob)
    roc_auc = auc(fpr, tpr)

    plt.figure()
    plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC curve (area = {roc_auc:.2f})')
    plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
    plt.xlim([0.0, 1.0])
    plt.ylim([0.0, 1.05])
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.title('Receiver Operating Characteristic')
    plt.legend(loc="lower right")
    plt.savefig(os.path.join(fig_path, f'{module_name}_roc_curve_{model_name}.png'))
    plt.close()

    # 混淆矩阵
    cm = confusion_matrix(y_test, y_pred)
    plt.figure(figsize=(8, 6))
    sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
    plt.title('Confusion Matrix')
    plt.xlabel('Predicted')
    plt.ylabel('Actual')
    plt.savefig(os.path.join(fig_path, f'{module_name}_confusion_matrix_{model_name}.png'))
    plt.close()

    # 特征重要性 (XGBoost)
    if hasattr(model, 'feature_importances_'):
        feat_importances = pd.Series(model.feature_importances_, index=X_test.columns)
        feat_importances.nlargest(15).sort_values().plot(kind='barh', figsize=(10, 6))
        plt.title('Top 15 Feature Importances')
        plt.savefig(os.path.join(fig_path, f'{module_name}_feature_importance_{model_name}.png'))
        plt.close()

    # 保存评估报告
    report = classification_report(y_test, y_pred, output_dict=True)
    report_df = pd.DataFrame(report).transpose()
    report_df.to_csv(os.path.join(fig_path, f'{module_name}_classification_report_{model_name}.csv'))

    return roc_auc
